﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using OcenyOpisowe.ViewModels;

namespace OcenyOpisowe.Controllers
{
	/// <summary>
	/// Główny kontroler aplikacji.
	/// Odpowiedzialny za zainicjowanie aplikacji na samym starcie.
	/// Dodatkowe funkcjonalności są obsługiwane przez pozostałe moduły.
	/// </summary>
	public class HomeController : Controller
	{
		/// <summary>
		/// Inicjuje widok strony głównej aplikacji.
		/// </summary>
		/// <returns>Widok, do którego przejść po zakończeniu metody.</returns>
		public ActionResult Index()
		{
			return View(new ApplicationStartModel()
			            	{
			            		ApplicationActionsMapUrl = Url.Action("Menu", "Home"),
			            		ApplicationUserInfoUrl = Url.Action("GetCurrentUserInfo", "Account")
			            	});
		}

		/// <summary>
		/// Akcja pozwalająca na pobranie konfiguracji menu aplikacji.
		/// Sprawdza ona uprawnienia danego użytkownika i wyświetla odpowiednie
		/// dla niego elementy menu.
		/// </summary>
		/// <returns>Konfiguracja menu zwrócona w postaci JSON.</returns>
		[HttpPost]
		public ActionResult Menu()
		{
			if (SiteMap.Provider is MvcSiteMapProvider.DefaultSiteMapProvider)
			{
				var context = System.Web.HttpContext.Current;
				var mvcSiteMapprovider = (MvcSiteMapProvider.DefaultSiteMapProvider)SiteMap.Provider;

				if (mvcSiteMapprovider.RootNode != null)
				{
					var applicationActionsCollection =
						from MvcSiteMapProvider.MvcSiteMapNode node in mvcSiteMapprovider.RootNode.ChildNodes
						where node.IsAccessibleToUser(context)
						select new ApplicationActionMapModel
						{
							Title = node.Title,
							Description = node.Description,
							Url =
								String.IsNullOrEmpty(node.Controller)
									? Url.Action(node.Action)
									: Url.Action(node.Action, node.Controller),
							IsDefault = mvcSiteMapprovider.CurrentNode == node,
							ChildActions = !node.HasChildNodes
											? null
											: from MvcSiteMapProvider.MvcSiteMapNode childNode in node.ChildNodes
											  where childNode.IsAccessibleToUser(context)
											  select new ApplicationActionMapModel
											  {
												  Title = childNode.Title,
												  Description = childNode.Description,
												  Url =
													  String.IsNullOrEmpty(childNode.Controller)
														  ? Url.Action(childNode.Action)
														  : Url.Action(childNode.Action, childNode.Controller),
												  IsDefault = mvcSiteMapprovider.CurrentNode == childNode
											  }
						};

					return new JsonResult
					       	{
					       		Data = new ApplicationActionsMapModel
					       		       	{
					       		       		MenuItems = applicationActionsCollection
					       		       	}
					       	};
				}
			}
			return new JsonResult
			       	{
			       		Data = new ApplicationActionsMapModel
			       		       	{
			       		       		MenuItems = new ApplicationActionMapModel[0]
			       		       	}
			       	};
		}
	}
}